<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport"
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>js闭包之构造函数作用域</title>
</head>
<body>
  <ul>
    <li>构造函数只是一种特殊的函数形式，也保持与函数作用域一致的生命周期</li>
    <li>每次使用new创建一个新对象，类似调用主函数返回一个新函数</li>
  </ul>
  <script>
    function Calculator() {
      this.i = 1
      this.sum = function() {
        console.log(`i:${++this.i}`)
      }
    }
    // 构造函数改造成普通函数
    function calculator() {
      let i = 1
      function sum() {
        console.log(`i:${++i}`)
      }
      return { sum }
    }
    // 构造函数实例化
    const a1 = new Calculator()
    a1.sum()    // i:2
    a1.sum()    // i:3
    const b1 = new Calculator()
    b1.sum()    // i:2
    b1.sum()    // i:3
    const c1 = new Calculator()
    c1.sum()    // i:2
    // 函数调用
    const a2 = calculator()
    a2.sum()    // i:2
    a2.sum()    // i:3
    const b2 = calculator()
    b2.sum()    // i:2
    b2.sum()    // i:3
    const c2 = calculator()
    c2.sum()    // i:2
  </script>
</body>
</html>